package com.tinet.reservas.bean;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

import com.tinet.reservas.UsuarioDao;
import com.tinet.reservas.model.Usuario;

import excepciones.ExisteUsuarioException;
import excepciones.ValidarUsuarioException;

/**
 * 
 * mapeo de bean de usuario .
 * 
 * @author tinet
 */
@Stateless(mappedName = "userbean", name = "userbean")
public class UsuarioBeanImpl implements UsuarioBean {
    /**
     * @param reservaDao
     *            .
     */
    private UsuarioDao dao;
    /**
     * @param reservas
     *            .
     */
    private List<Usuario> usuarios;

    /**
     * Entity manager para manejar la conexion con la capa de persistencia.
     */
    @PersistenceContext(unitName = "MySqlDS")
    private EntityManager em;

    /**
     * post constructor.
     */
    @PostConstruct
    // crea una instancia de dao en la clase bean
    private void init() {
        if (dao == null) {
            dao = new UsuarioDao(em);

        }
    }

    /**
     * 
     * @method getReservas
     * @return reservas
     */
    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    /**
     * 
     * @method setReservas
     * @throws ExisteReservaException .
     * @param reservas
     *            .
     */
    public void setUsuarios(ArrayList<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    /**
     * 
     * @method getEm
     * @return em .
     * 
     */
    public EntityManager getEm() {
        return em;
    }

    /**
     * 
     * @method setEm
     * @param em
     *            .
     * @throws ExisteReservaException .
     */
    public void setEm(EntityManager em) {
        this.em = em;
    }

    /**
     * 
     * @method mostrarTodo
     * @return lista de reservas .
     * 
     */
    public List<Usuario> mostrarTodo() { // muestra todos los datos de la
                                         // tabla

        return dao.mostrarTodo();

    }

    /**
     * 
     * @method mostrarUsuario
     * @return lista de reservas de un usuario .
     * @param usuario
     *            .
     */
    public Usuario mostrarUsuario(Usuario usuario) { // muestra un solo usuario

        return dao.mostrarUsuario(usuario);

    }

    /**
     * 
     * @method agregar
     * @param usuario
     *            .
     * @throws ExisteReservaException .
     */
    public void insertar(Usuario usuario) throws ExisteUsuarioException {

        Usuario userRepetido = new Usuario();
        try {
            userRepetido = dao.mostrarUsuario(usuario);
        } catch (NoResultException e) {
            // e.printStackTrace();

        }

        if (!usuario.getNombreUser().equals(userRepetido.getNombreUser())) {

            dao.insertar(usuario);

        } else {
            // verificar que usuario no existe

            throw new ExisteUsuarioException();

            // throw new ExisteUsuarioException();
        }

       
    }

    /**
     * 
     * @method editar
     * @param usuario
     *            .
     * @throws ExisteReservaException .
     */
    public void editar(Usuario usuario) {
        dao.editar(usuario);

    }

    /**
     * 
     * @method eliminar
     * @param usuario
     *            .
     * 
     */
    public void eliminar(Usuario usuario) {
        dao.eliminar(usuario);

    }

    /**
     * 
     * @method validarUsuario
     * @param user
     *            .
     * @throws ValidarUsuarioException .
     * @return un usuario .
     * 
     */
    public Usuario validarUsuario(Usuario user) throws ValidarUsuarioException {
        try {
            dao.validarUsuario(user);
        } catch (NoResultException e) {
            throw new ValidarUsuarioException(); // valida que el user exista
        }

        return dao.validarUsuario(user);

    }
}
